home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / perl-cleaner < prev    next >
Text File  |  2005-10-13  |  9KB  |  304 lines

  1. #!/bin/bash
  2.  
  3. # sort of a changelog if you want to call it that...
  4. # version 1.2 - swtaylor gave some good pointers on making the tmp files, as well as reminding me of grep's -f functionality :)
  5. # version 1.1 - Mr. Bones gave a lot of good input on cleaning up the script
  6. # Version 1 - stuff
  7.  
  8. # First and foremost - make sure we have a perl to work with...
  9. PERL=$(which perl)
  10. if [ "${PERL}x" == "x" ]; then
  11.    echo "NO PERL INSTALLED!! (at least not in your path)"
  12.    exit
  13. fi
  14. eval $(perl '-V:version')
  15. PERL_VERSION=${version}
  16.  
  17. TMPDIR=${TMPDIR:-/tmp}
  18.  
  19. PKGDIR=$(/usr/bin/portageq vdb_path)
  20. DATESTAMP=$(date +"%Y%m%d%H%M%S")
  21. LOG=$(mktemp ${TMPDIR}/perl-cleaner.log.$DATESTAMP.XXXXXXXXXX)
  22. PAGER=${PAGER:-more}
  23.  
  24. # Set up our temporary files
  25. MODULES_LIST=$(mktemp ${TMPDIR}/modules.list.XXXXXXXXXX)
  26. EBUILDS_PREINSTALL=$(mktemp ${TMPDIR}/ebuilds.preinstall.XXXXXXXXXX)
  27. EBUILDS_ORDERED=$(mktemp ${TMPDIR}/ebuilds.ordered.XXXXXXXXXX)
  28. EBUILDS_REINSTALL=$(mktemp ${TMPDIR}/ebuilds.reinstall.XXXXXXXXXX)
  29.  
  30. ASK=""
  31.  
  32. if [ ! -z $2 ]; then
  33.    ASK="--ask"
  34. fi
  35.  
  36.  
  37.  
  38. function postclean {
  39.    for FILE in ${MODULES_LIST} ${EBUILDS_PREINSTALL} ${EBUILDS_ORDERED} ${EBUILDS_REINSTALL}; do
  40.  
  41.       if [ -f $FILE ]; then
  42.          rm -f $FILE
  43.       fi
  44.  
  45.    done
  46.  
  47.    if [ -s $LOG ]; then
  48.      echo
  49.      echo "For a complete log, please read $LOG"
  50.      echo
  51.    else
  52.       if [ -f $LOG ]; then
  53.     rm -f $LOG
  54.       fi
  55.    fi
  56. }
  57.  
  58. # This is to clean out the old .ph files generated in our last perl install
  59. function ph_clean() {
  60.    echo "$(date) : Beginning a clean up of .ph files" | tee -a $LOG
  61.  
  62.    INC=$(perl -e 'for $line (@INC) { next if $line eq "."; next if $line =~ m/'${PERL_VERSION}'/; print "$line\n" }')
  63.  
  64.    echo "Locating ph files for removal"
  65.    for DIR in $INC; do
  66.       if [ -d $DIR ]; then
  67.          for file in $(find $DIR -name "*.ph" -type f); do
  68.             if [ ! $(echo "$file"|grep $PERL_VERSION) ]; then
  69.                echo "$(date) : Removing old ph file: $file" | tee -a $LOG
  70.                rm $file
  71.             fi
  72.          done
  73.       fi
  74.    done
  75.    for DIR in $INC; do
  76.      for empty in $(find $DIR -type d); do
  77.         # Silently remove those dirs that we just emptied
  78.          rmdir $empty  >/dev/null 2>&1
  79.         done
  80.    done
  81. }
  82.  
  83. # Generate ph files; this is useful if we've upgraded packages with headers so that perl knows the new info
  84. function ph_update() {
  85.    echo "$(date) : Updating ph files" | tee -a $LOG
  86.    cd /usr/include; h2ph * sys/* arpa/* netinet/* bits/* security/* asm/* gnu/* linux/* | tee -a $LOG
  87.    cd /usr/include/linux; h2ph * | tee -a $LOG
  88. }
  89.  
  90. # Build a list of modules installed under older perls - only valid if the module was an ebuild :)
  91. function module_list() {
  92. # Reset INC - INC is dynamically generated, and if we removed any ph 
  93. # files - and they were the only thing left in a dir - then there's 
  94. # no sense in revisiting that dir
  95.    echo "$(date) : Building list of modules for reinstall" | tee -a $LOG
  96.    INC=$(perl -e 'for $line (@INC) { next if $line eq "."; next if $line =~ m/'${PERL_VERSION}'/; print "$line\n" }')
  97.    MODFIND=$(mktemp ${TMPDIR}/modules.found.XXXXXXXXXX)
  98.    echo "Locating modules for reinstall"
  99.    for DIR in $INC; do
  100.       if [ -d $DIR ]; then
  101.          for file in $(find $DIR -iname "*.pm" -type f|grep -v "${PERL_VERSION}"); do
  102.         echo "$file" >>$MODFIND
  103.          done
  104.       fi
  105.    done
  106.    grep -f $MODFIND -l $PKGDIR/*/*/CONTENTS >${MODULES_LIST}
  107.    rm $MODFIND
  108. }
  109.  
  110. # The meat of it - rebuilding the ebuilds
  111. # ALL emerges are oneshots - we don't want to mess with the world file
  112. # We first attempt to emerge the specific module that was installed last time
  113. # If that fails, we attempt to install a newer version
  114.  
  115. function ebuild_rebuild() {
  116.  
  117.    echo "$(date) : Rebuilding modules: Building list of ebuilds" | tee -a $LOG
  118.    if [ -s ${MODULES_LIST} ]; then
  119.       for line in $(sort -u ${MODULES_LIST}); do
  120.          echo "$line"|sed -e 's|.*pkg/||' -e 's|/CONTENTS||'|grep -v "dev-lang/perl" >>${EBUILDS_PREINSTALL}
  121.       done
  122.    fi
  123.  
  124.  
  125. # If they asked for interactive, let them see what will be reinstalled
  126.    if [ -s ${EBUILDS_PREINSTALL} ]; then
  127.   
  128.      if [ ! -z $ASK ]; then
  129.         echo "Press Enter to see the list of ebuilds we'll be avaluating"
  130.         read key
  131.         $PAGER ${EBUILDS_PREINSTALL}
  132.         printf "Continue? (Y/N) "
  133.         read ANSWER
  134.         if [ $(echo "${ANSWER}" | egrep -e "^n|N" ) ]; then
  135.            echo "$(date) : USER ABORTED REBUILD">>$LOG
  136.            exit
  137.         fi
  138.      fi
  139.   
  140.      for EBUILD in $(cat ${EBUILDS_PREINSTALL} ); do
  141.         if emerge --oneshot -p "=$EBUILD"|egrep -q ".*ebuilds.*satisfy"; then
  142.            if emerge --oneshot -p ">=$EBUILD"|egrep -q ".*ebuilds.*satisfy"; then
  143.               echo "$(date) : There are no unmasked ebuilds to satisfy $EBUILD. Skipping" | tee -a $LOG
  144.               sleep 2
  145.            else
  146.               if [ ! -z $ASK ]; then
  147.                  printf "${EBUILD} isn't available, but a new version is. Install? (Y/N) "
  148.                  read ANSWER
  149.                  if [ $(echo "${ANSWER}" | egrep -e "^y|Y" ) ]; then
  150.                     echo ">=$EBUILD" >> ${EBUILDS_ORDERED}
  151.                 echo "$(date) : User chose to install >=${EBUILD}">>$LOG
  152.                  fi
  153.               else
  154.                  echo ">=$EBUILD" >>${EBUILDS_ORDERED}
  155.               fi
  156.            fi
  157.      else
  158.         echo "=$EBUILD">>${EBUILDS_ORDERED}
  159.      fi
  160.      done
  161.  
  162.     if [ -s ${EBUILDS_ORDERED} ]; then
  163.      if [ ! -z $ASK ]; then
  164.         echo "Press Enter to see the final list of ebuilds to install"
  165.         read key
  166.         $PAGER ${EBUILDS_ORDERED}
  167.         printf "Continue? (Y/N) "
  168.         read ANSWER
  169.         if [ $(echo "${ANSWER}" | egrep -e "^n|N" ) ]; then
  170.            echo "$(date) : USER ABORTED REBUILD">>$LOG
  171.            exit
  172.         fi
  173.      fi
  174.  
  175. # Cut down to one line so portage can handle ordering these appropriately
  176.      emerge -p --oneshot $(cat ${EBUILDS_ORDERED} ) | grep ebuild | sed -e 's:\([^ ]\+\):=\1:g' -e 's:.*\] \([^ ]*\) .*:\1:'>>${EBUILDS_REINSTALL}
  177.  
  178.      echo "Reinstalling ebuilds"
  179.      echo "$(date) : Ebuilds to reinstall: ">>$LOG
  180.      cat ${EBUILDS_REINSTALL}>>$LOG
  181.      echo >>$LOG
  182.  
  183. # Now that we have them in the right order, emerge them one at a time
  184. # This is to avoid problems if one doesn't emerge correctly
  185.  
  186.      for EBUILD in $(cat ${EBUILDS_REINSTALL}); do
  187.         emerge --oneshot ${ASK} "$EBUILD"
  188.      done
  189.     else
  190.        echo
  191.        echo "Nothing to reinstall!"
  192.        echo
  193.     fi
  194.    else
  195.        echo
  196.        echo "Nothing to reinstall!"
  197.        echo
  198.    fi
  199.  
  200. }
  201.  
  202. # Locate .so's and binaries linked against libperl.so
  203. # The coup is in ! -newer libperl.so - cut out anything that was obviously installed
  204. # after our last install of libperl, which should cut out the false positives.
  205.  
  206. function libperl_list() {
  207.    echo "$(date) : Locating ebuilds linked against libperl" | tee -a $LOG
  208.    for i in $(find $(egrep -v ^# /etc/ld.so.conf) -type f -name '*.so*' ! -newer /usr/lib/libperl.so ) \
  209.          $(find $(echo $PATH | sed 's/:/ /g') -type f -perm +0111 ! -newer /usr/lib/libperl.so ) ;
  210.    do
  211.      if [ -f ${i} ]; then
  212.         ldd ${i} 2>&1 | grep "libperl" - >/dev/null && grep -l $i $PKGDIR/*/*/CONTENTS>>${MODULES_LIST};
  213.      fi
  214.    done 
  215.  
  216. }
  217.  
  218. # Assuming a successful module run, look to see whats left over
  219. function leftovers() {
  220.    echo "$(date) : Finding left over modules" | tee -a $LOG
  221.  
  222.    echo "$(date) : The following files remain. These were either installed by hand" | tee -a $LOG
  223.    echo "$(date) : or edited. This script cannot deal with them." | tee -a $LOG
  224.    echo | tee -a $LOG
  225.  
  226.  
  227.    INC=$(perl -e 'for $line (@INC) { next if $line eq "."; next if $line =~ m/'${PERL_VERSION}'/; print "$line\n" }')
  228.    for DIR in $INC; do
  229.       if [ -d $DIR ]; then
  230.          for file in $(find $DIR -type f |grep -v  "${PERL_VERSION}" ) ; do
  231.             echo "$(date) : ${file}" | tee -a $LOG
  232.          done
  233.       fi
  234.    done
  235. }
  236.  
  237.  
  238. case "$1" in
  239.    leftovers)
  240.       leftovers
  241.       ;;
  242.    allmodules)
  243.       PERL_VERSION="0.0.0"
  244.       module_list
  245.       ebuild_rebuild
  246.       leftovers
  247.       ;;
  248.    modules)
  249.       module_list
  250.       ebuild_rebuild
  251.       leftovers
  252.       ;;
  253.    libperl)
  254.       libperl_list
  255.       ebuild_rebuild
  256.       ;;
  257.    ph-clean)
  258.       ph_clean
  259.       ;;
  260.    phupdate)
  261.       ph_update
  262.       ;;
  263.    phall)
  264.       ph_clean
  265.       ph_update
  266.       ;;
  267.    all)
  268.       ph_clean
  269.       ph_update
  270.       module_list
  271.       libperl_list
  272.       ebuild_rebuild
  273.       leftovers
  274.       ;;
  275.     reallyall)
  276.       PERL_VERSION="0.0.0"
  277.       ph_clean
  278.       ph_update
  279.       module_list
  280.       libperl_list
  281.       ebuild_rebuild
  282.       leftovers
  283.       ;;
  284.    *)
  285.    echo "Usage: $0 [options] [ask]"
  286.    printf "\tmodules - rebuild perl modules for old installs of perl\n"
  287.    printf "\tallmodules - rebuild perl modules for any install of perl\n"
  288.    printf "\tlibperl - rebuild anything linked against libperl\n"
  289.    printf "\tph-clean - clean out old ph files from a previous perl\n"
  290.    printf "\tphupdate - update existing ph files, useful after an upgrade to system parts like the kernel\n"
  291.    printf "\tphall - clean out old ph files and run phupdate\n"
  292.    printf "\tall - rebuild modules, libperl linkages, clean ph files, and rebuild them\n"
  293.    printf "\treallyall - rebuild modules for any install of perl, libperl linkages, clean ph files, and rebuild them\n"
  294.    printf "\n"
  295.    printf "\task - ask for confirmation on each emerge"
  296.    printf "\n\n"
  297.    
  298.       ;;
  299. esac
  300.  
  301. postclean
  302.  
  303. exit
  304.